package com.cskaoyan.javase.oop3._2inner._0introduction;
/**
 * 引例
 *
 * 我们现在做一个应用程序，需要描述一台电脑中的CPU，对于电脑而言，该怎么去描述这个CPU呢？
 *
 * 分析：
 * 我们可以创建两个类，一个描述Computer，一个描述CPU。但这样明显是有问题的：
 *
 *      1.CPU是电脑中最重要的组件，但它脱离电脑存在就是一粒沙子。这意味着CPU对象，应仅存在于Computer内部。
 *      CPU这个类不能在计算机外部创建对象.
 *      因为单独定义的一个类,它没有私有权限的概念,最小的权限是在同包下可以创建对象.
 *      不能让一个类只在某个类中创建对象.
 *
 *      2.CPU可以控制计算机的一切硬件资源。
 *          这意味CPU对象能够操控，Computer类中的所有成员，无论私有。
 *          两个独立定义的类,是不可能直接访问对方私有成员的.
 *          总之定义普通类CPU是不能完成需求的，因为：
 *              普通类没有私有概念，不可能控制仅能在Computer内部创建对象。
 *          普通类不可能直接访问，其它类的私有成员。
 *
 *
 * 显然CPU类不应该是一个普通类，不应该是一个独立的类 ---> 不再将CPU类定义为一个独立的类，而是将它放入Computer类的类体中，可以近似的看成是一个Computer类的成员 ---> CPU类近似看成Computer类的成员，
 * 作为其他类当中的内部类,于是：
 *      1.在其它类内部的类，就有了私有概念，就有了四种访问权限。只需要在内部私有化一个类，那么在外界就无法创建它的对象了。
 *      2.既然已经成为了成员，成为了"自己人"，那么就不再受限于权限控制了，内部类就可以访问包裹它的类的所有成员，包括私有。
 *
 * 上述两条，其实就是（成员）内部类的主要特点。
 * 也说明了使用内部类的主要场景：
 *      1.内部类是一种比类更加极致的封装思想体现，内部类的成员不仅被类自身保护，还被包裹着它的类保护。
 *      用于隐藏和保护类
 *
 *      2.内部类和包裹它的类互相成为了"好兄弟"，互相访问成员都不受访问权限限制。
 *      如果你希望两个类之间互相访问成员不受限制,就必须定义内部类,定义普通类是做不到的.
 * 当你有以上使用场景时，就可以考虑使用内部类。
 *--------------------------------------------------
 *      内部类的定义:
 *          在Java语言中类可以嵌套定义，广义的内部类指的是定义在另一类当中的一个类。
 *
 *          当然内部类有很多，如果按照内部类在类中定义的位置不同，可以分为：
 *              1.定义在成员位置的内部类，包括成员内部类，静态内部类。
 *              2.定义在局部位置的内部类，包括局部内部类，匿名内部类，Lambda表达式。(主要是定义在方法当中)
 *          但是我们在学习的时候，不按定义位置来学习。我们按照这个内部类是定义一个类，还是直接创建一个对象来分类：
 *              1.内部类语法上定义一个类,包括:
 *                  a.成员内部类
 *                  b.静态内部类
 *                  c.局部内部类
 *              2.内部类语法直接创建一个对象,包括:
 *                  a.匿名内部类(对象)
 *                  b.Lambda表达式
 *
 * 内部类是典型的，Java从C++中拿过来但是没有经过特别简化的特性，这意味着内部类是比较复杂的一个语法，
 *      通过内部类可以稍微感受一下C++的语法复杂性。
 *
 * 为了上课方便，我们需要统一口径，在内部类课程当中，我们统一规定：
 *      像CPU这种，定义在别的类的内部的类，我们称之为内部类。（inner）
 *      像Computer这种，包裹内部类的，我们称之为外围类。（enclosed）
 *      Demo这种类我们称之为外部类或者其他类。（outside）
 *
 * @since 10:00
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // 私有化的内部类,外界不能创建对象
        // CPU cpu = new CPU();
    }
}
// 电脑类
class Computer{
    private CPU c = new CPU();
    private int num;

    // CPU类
    private class CPU{
        int a;
        int b;
    }

    public void test(){}
}

// // CPU类
// class CPU{
//
// }